package com.herench.bs.transfer;

import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 获取患者住院末次住院信息
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class GetPatInHosTransfer extends AbstractTransfer {
    public GetPatInHosTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 身份证号
        String idNo = (String) params.get("idNo");
        // 患者ID
        String patientId = (String) params.get("patientId");

        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个入参数设值（入参==》XML）
        Element dataRow = document.getRootElement().element("CommitData").addElement("Data").addElement("DataRow");
        // 身份证号
        dataRow.addAttribute("ID_NO", idNo);
        // 患者ID
        dataRow.addAttribute("PATIENT_ID", patientId);

        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");
        List<Map<String, Object>> dataList = new ArrayList<>();

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）
            // 取得数据为数组形式
            List<Element> dataRowList = document.getRootElement().element("ReturnData").element("Data").elements();

            if (dataRowList == null || dataRowList.size() == 0) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                for (Element dataRow : dataRowList) {
                    Map<String, Object> subMap = new HashMap<>(16);
                    GetPatInHosInnerMessage innerMessage = new GetPatInHosInnerMessage(dataRow);

                    // 住院号
                    subMap.put("inpNo", innerMessage.getInpNo());
                    // 患者ID
                    subMap.put("patientId", innerMessage.getPatientId());
                    // 住院次数
                    subMap.put("visitId", innerMessage.getVisitId());
                    // 患者姓名
                    subMap.put("name", innerMessage.getName());
                    // 性别
                    subMap.put("sex", innerMessage.getSex());
                    // 出生日期
                    subMap.put("dateOfBirth", innerMessage.getDateOfBirth());
                    // 身份证号
                    subMap.put("idNo", innerMessage.getIdNo());
                    // 家庭地址
                    subMap.put("mailingAddress", innerMessage.getMailingAddress());
                    // 患者工作电话
                    subMap.put("phoneNumberBusiness", innerMessage.getPhoneNumberBusiness());
                    // 联系人姓名
                    subMap.put("nextOfKin", innerMessage.getNextOfKin());
                    // 联系人关系
                    subMap.put("realationship", innerMessage.getRealationship());
                    // 联系人电话
                    subMap.put("nextOfKinPhone", innerMessage.getNextOfKinPhone());
                    // 入院时间
                    subMap.put("admissionDateTime", innerMessage.getAdmissionDateTime());
                    // 出院时间
                    subMap.put("dischargeDateTime", innerMessage.getDischargeDateTime());
                    // 住院天数
                    subMap.put("days", innerMessage.getDays());
                    // 病区代码
                    subMap.put("deptAdmissionTo", innerMessage.getDeptAdmissionTo());
                    // 病区
                    subMap.put("wardName", innerMessage.getWardName());
                    // 床位号
                    subMap.put("bedNo", innerMessage.getBedNo());
                    // 主治医生
                    subMap.put("attendingDoctor", innerMessage.getAttendingDoctor());
                    // 责任护士
                    subMap.put("nurseResponsibility", innerMessage.getNurseResponsibility());
                    // 总费用
                    subMap.put("totalcharges", innerMessage.getTotalcharges());
                    // 预交金费用
                    subMap.put("totalprepay", innerMessage.getTotalprepay());
                    // 未结算总额
                    subMap.put("unsettled", innerMessage.getUnsettled());
                    // 已结算总额
                    subMap.put("settled", innerMessage.getSettled());
                    // 当前结存余额
                    subMap.put("balance", innerMessage.getBalance());
                    // 患者状态
                    subMap.put("status", innerMessage.getStatus());
                    // 患者家庭电话
                    subMap.put("phoneNumberHome", innerMessage.getPhoneNumberHome());
                    // 住院患者电话
                    subMap.put("currentPhone", innerMessage.getCurrentPhone());
                    // 是否已办理医保 = 1:已办理,其他:未办理
                    subMap.put("insurStatus", innerMessage.getCurrentPhone());

                    // 追加一行数据到List
                    dataList.add(subMap);
                }

                // 返回所有行数据
                resMap.put("dataList", dataList);
                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }

    public class GetPatInHosInnerMessage implements InnerMessage{

        /**
         * 住院号
         */
        private String inpNo;
        /**
         * 患者ID
         */
        private String patientId;
        /**
         * 住院次数
         */
        private String visitId;
        /**
         * 患者姓名
         */
        private String name;
        /**
         * 性别
         */
        private String sex;
        /**
         * 出生日期
         */
        private String dateOfBirth;
        /**
         * 身份证号
         */
        private String idNo;
        /**
         * 家庭地址
         */
        private String mailingAddress;
        /**
         * 患者工作电话
         */
        private String phoneNumberBusiness;
        /**
         * 联系人姓名
         */
        private String nextOfKin;
        /**
         * 联系人关系
         */
        private String realationship;
        /**
         * 联系人电话
         */
        private String nextOfKinPhone;
        /**
         * 入院时间
         */
        private String admissionDateTime;
        /**
         * 出院时间
         */
        private String dischargeDateTime;
        /**
         * 住院天数
         */
        private String days;
        /**
         * 病区代码
         */
        private String deptAdmissionTo;
        /**
         * 病区
         */
        private String wardName;
        /**
         * 床位号
         */
        private String bedNo;
        /**
         * 主治医生
         */
        private String attendingDoctor;
        /**
         * 责任护士
         */
        private String nurseResponsibility;
        /**
         * 总费用
         */
        private String totalcharges;
        /**
         * 预交金费用
         */
        private String totalprepay;
        /**
         * 未结算总额
         */
        private String unsettled;
        /**
         * 已结算总额
         */
        private String settled;
        /**
         * 当前结存余额
         */
        private String balance;
        /**
         * 患者状态
         */
        private String status;
        /**
         * 患者家庭电话
         */
        private String phoneNumberHome;
        /**
         * 住院患者电话
         */
        private String currentPhone;
        /**
         * 是否已办理医保 = 1:已办理,其他:未办理
         */
        private String insurStatus;



        public GetPatInHosInnerMessage(Element element) {
            // 住院号
            this.inpNo = element.attributeValue("INP_NO");
            // 患者ID
            this.patientId = element.attributeValue("PATIENT_ID");
            // 住院次数
            this.visitId = element.attributeValue("VISIT_ID");
            // 患者姓名
            this.name = element.attributeValue("NAME");
            // 性别
            this.sex = element.attributeValue("SEX");
            // 出生日期
            this.dateOfBirth = element.attributeValue("DATE_OF_BIRTH");
            // 身份证号
            this.idNo = element.attributeValue("ID_NO");
            // 家庭地址
            this.mailingAddress = element.attributeValue("MAILING_ADDRESS");
            // 患者工作电话
            this.phoneNumberBusiness = element.attributeValue("PHONE_NUMBER_BUSINESS");
            // 联系人姓名
            this.nextOfKin = element.attributeValue("NEXT_OF_KIN");
            // 联系人关系
            this.realationship = element.attributeValue("REALATIONSHIP");
            // 联系人电话
            this.nextOfKinPhone = element.attributeValue("NEXT_OF_KIN_PHONE");
            // 入院时间
            this.admissionDateTime = element.attributeValue("ADMISSION_DATE_TIME");
            // 出院时间
            this.dischargeDateTime = element.attributeValue("DISCHARGE_DATE_TIME");
            // 住院天数
            this.days = element.attributeValue("DAYS");
            // 病区代码
            this.deptAdmissionTo = element.attributeValue("DEPT_ADMISSION_TO");
            // 病区
            this.wardName = element.attributeValue("WARD_NAME");
            // 床位号
            this.bedNo = element.attributeValue("BED_NO");
            // 主治医生
            this.attendingDoctor = element.attributeValue("ATTENDING_DOCTOR");
            // 责任护士
            this.nurseResponsibility = element.attributeValue("NURSE_RESPONSIBILITY");
            // 总费用
            this.totalcharges = element.attributeValue("TOTALCHARGES");
            // 预交金费用
            this.totalprepay = element.attributeValue("TOTALPREPAY");
            // 未结算总额
            this.unsettled = element.attributeValue("UNSETTLED");
            // 已结算总额
            this.settled = element.attributeValue("SETTLED");
            // 当前结存余额
            this.balance = element.attributeValue("BALANCE");
            // 患者状态
            this.status = element.attributeValue("STATUS");
            // 患者家庭电话
            this.phoneNumberHome = element.attributeValue("PHONE_NUMBER_HOME");
            // 住院患者电话
            this.currentPhone = element.attributeValue("CURRENT_PHONE");
            // 是否已办理医保 = 1:已办理,其他:未办理
            this.insurStatus = element.attributeValue("INSUR_STATUS");

        }

        /**
         * 住院号
         */
        public String getInpNo() {
            return inpNo;
        }
        /**
         * 患者ID
         */
        public String getPatientId() {
            return patientId;
        }
        /**
         * 住院次数
         */
        public String getVisitId() {
            return visitId;
        }
        /**
         * 患者姓名
         */
        public String getName() {
            return name;
        }
        /**
         * 性别
         */
        public String getSex() {
            return sex;
        }
        /**
         * 出生日期
         */
        public String getDateOfBirth() {
            return dateOfBirth;
        }
        /**
         * 身份证号
         */
        public String getIdNo() {
            return idNo;
        }
        /**
         * 家庭地址
         */
        public String getMailingAddress() {
            return mailingAddress;
        }
        /**
         * 患者工作电话
         */
        public String getPhoneNumberBusiness() {
            return phoneNumberBusiness;
        }
        /**
         * 联系人姓名
         */
        public String getNextOfKin() {
            return nextOfKin;
        }
        /**
         * 联系人关系
         */
        public String getRealationship() {
            return realationship;
        }
        /**
         * 联系人电话
         */
        public String getNextOfKinPhone() {
            return nextOfKinPhone;
        }
        /**
         * 入院时间
         */
        public String getAdmissionDateTime() {
            return admissionDateTime;
        }
        /**
         * 出院时间
         */
        public String getDischargeDateTime() {
            return dischargeDateTime;
        }
        /**
         * 住院天数
         */
        public String getDays() {
            return days;
        }
        /**
         * 病区代码
         */
        public String getDeptAdmissionTo() {
            return deptAdmissionTo;
        }
        /**
         * 病区
         */
        public String getWardName() {
            return wardName;
        }
        /**
         * 床位号
         */
        public String getBedNo() {
            return bedNo;
        }
        /**
         * 主治医生
         */
        public String getAttendingDoctor() {
            return attendingDoctor;
        }
        /**
         * 责任护士
         */
        public String getNurseResponsibility() {
            return nurseResponsibility;
        }
        /**
         * 总费用
         */
        public String getTotalcharges() {
            return totalcharges;
        }
        /**
         * 预交金费用
         */
        public String getTotalprepay() {
            return totalprepay;
        }
        /**
         * 未结算总额
         */
        public String getUnsettled() {
            return unsettled;
        }
        /**
         * 已结算总额
         */
        public String getSettled() {
            return settled;
        }
        /**
         * 当前结存余额
         */
        public String getBalance() {
            return balance;
        }
        /**
         * 患者状态
         */
        public String getStatus() {
            return status;
        }
        /**
         * 患者家庭电话
         */
        public String getPhoneNumberHome() {
            return phoneNumberHome;
        }
        /**
         * 住院患者电话
         */
        public String getCurrentPhone() {
            return currentPhone;
        }
        /**
         * // 是否已办理医保 = 1:已办理,其他:未办理
         */
        public String getInsurStatus() {
            return insurStatus;
        }


    }
}
